Don't use current package when reading lockfile
authorAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 25 Aug 2016 10:10:45 +0000 (13:10 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 25 Aug 2016 10:26:48 +0000 (13:26 +0300)
src/cargo/core/resolver/encode.rs
tests/install.rs
tests/workspaces.rs

index 1f260761aecb9cd02798c7a81b1fc5d4f0227908..3e049ca5c2d9a906091669beaac05987ad05d187 100644 (file)
@@ -23,19 +23,16 @@ pub type Metadata = BTreeMap<String, String>;
 impl EncodableResolve {
     pub fn into_resolve(self, ws: &Workspace) -> CargoResult<Resolve> {
         let path_deps = build_path_deps(ws);
-        let default = try!(ws.current()).package_id().source_id();
 
         let mut g = Graph::new();
         let mut tmp = HashMap::new();
         let mut replacements = HashMap::new();
 
         let id2pkgid = |id: &EncodablePackageId| {
-            to_package_id(&id.name, &id.version, id.source.as_ref(),
-                          default, &path_deps)
+            to_package_id(&id.name, &id.version, id.source.as_ref(), &path_deps)
         };
         let dep2pkgid = |dep: &EncodableDependency| {
-            to_package_id(&dep.name, &dep.version, dep.source.as_ref(),
-                          default, &path_deps)
+            to_package_id(&dep.name, &dep.version, dep.source.as_ref(), &path_deps)
         };
 
         let packages = {
@@ -127,7 +124,6 @@ impl EncodableResolve {
             let id = try!(to_package_id(&id.name,
                                         &id.version,
                                         id.source.as_ref(),
-                                        default,
                                         &path_deps));
             let v = if v == "<none>" {
                 None
@@ -194,11 +190,14 @@ fn build_path_deps(ws: &Workspace) -> HashMap<String, SourceId> {
 fn to_package_id(name: &str,
                  version: &str,
                  source: Option<&SourceId>,
-                 default_source: &SourceId,
                  path_sources: &HashMap<String, SourceId>)
                  -> CargoResult<PackageId> {
-    let source = source.or(path_sources.get(name)).unwrap_or(default_source);
-    PackageId::new(name, version, source)
+    if let Some(source) = source.or(path_sources.get(name)) {
+        PackageId::new(name, version, source)
+    } else {
+        let dummy_source = SourceId::from_url("path+file:///dummy_path").unwrap();
+        PackageId::new(name, version, &dummy_source)
+    }
 }
 
 
index 45eabb782dfe9958d404bf4de5e6fae504702721..5a9182a32429f7c6fa3d2e2b0b71d1ade0ca4735 100644 (file)
@@ -750,7 +750,7 @@ fn git_with_lockfile() {
             [root]
             name = "foo"
             version = "0.1.0"
-            dependencies = [ "b 0.1.0" ]
+            dependencies = [ "bar 0.1.0" ]
 
             [[package]]
             name = "bar"
index 8ded09b772a98fec4e537178243dc2efbf4cd419..ab3b117fab8b887be809907bfa5ab02c5c6d9248 100644 (file)
@@ -910,3 +910,33 @@ fn workspace_in_git() {
     assert_that(p.cargo("build"),
                 execs().with_status(0));
 }
+
+
+#[test]
+fn lockfile_can_specify_nonexistant_members() {
+    let p = project("foo")
+        .file("Cargo.toml", r#"
+            [workspace]
+            members = ["a"]
+        "#)
+        .file("a/Cargo.toml", r#"
+            [project]
+            name = "a"
+            version = "0.1.0"
+            authors = []
+        "#)
+        .file("a/src/main.rs", "fn main() {}")
+        .file("Cargo.lock", r#"
+            [root]
+            name = "a"
+            version = "0.1.0"
+
+            [[package]]
+            name = "b"
+            version = "0.1.0"
+        "#);
+
+    p.build();
+
+    assert_that(p.cargo("build").cwd(p.root().join("a")), execs().with_status(0));
+}